package com.soms.util;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 承载分页数据
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageInfo<T> {
    /**
     * 当前页码，默认是1
     */
    private Integer currentPage = 1;
    /**
     * 每页的数量，默认是10条/页
     */
    private Integer pageSize = 10;
    /**
     * 可变的查询条件
     */
    private Map<String, Object> params = new HashMap<>();
    /**
     * 符合查询条件的总数据量，根据params使用SQL语句查询得到
     */
    private Integer totalCount;
    /**
     * 符合查询条件的总页数，根据totalCount和pageSize计算得到
     */
    private Integer totalPage;
    /**
     * T在实际使用的时候，可以是Role、User、Provider、Bill...
     */
    private List<T> data;

    /**
     * 设置总数量和计算总页数
     *
     * @param totalCount
     */
    public void setTotalCount(Integer totalCount) {
        this.totalCount = totalCount;
        // 同时计算得到totalPage
        // 每页10条，总数量是1，页数是1, totalCount(1) / pageSize(10) = 0, 0 + 1
        // 每页10条，总数量是10，页数是1, totalCount(10) / pageSize(10) =1, 1 + 0
        // 每页10条，总数量是11，页数是2
        // 每页10条，总数量是20，页数是2
        // 每页10条，总数量是21，页数是3
        // 每页10条，总数量是30，页数是3
        int totalPage = totalCount / pageSize + ((totalCount % pageSize == 0 ) ? 0 : 1);
        setTotalPage(totalPage);
    }

    /**
     * 添加一个条件
     *
     * @param key
     * @param value
     */
    public PageInfo<T> addParam(String key, Object value) {
        params.put(key, value);
        return this;
    }

    /**
     * 移除一个条件
     *
     * @param key
     */
    public PageInfo<T> removeParam(String key) {
        params.remove(key);
        return this;
    }
}
